package practiceProjects;

import java.io.*;

/**
 * @Project ：learn_java
 * @File ：moveAllPdfFilesInCDrive.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/2 09:45
 * @Description ：将源文件夹内所有子文件夹中的唯一文件移动到目标文件夹，并删除原子文件夹
 */
public class moveAllPdfFilesInCDriveDemo02 {
    public static void main(String[] args) {
        String srcPath = "C:\\Users\\zhq11\\AppData\\Roaming\\pcsuite\\data\\Note\\Document";
        String destPath = "E:\\DDD\\file\\大文件\\电子书\\pdf文件";

        moveAndDelete(srcPath, destPath);
    }

    /**
     * 移动子文件夹中的文件到目标路径，并删除子文件夹
     */
    public static void moveAndDelete(String sourceFilePath, String destinationFilePath) {
        File sourceDir = new File(sourceFilePath);
        if (!sourceDir.exists() || !sourceDir.isDirectory()) {
            System.err.println("源路径不是有效的文件夹: " + sourceFilePath);
            return;
        }

        File[] subDirs = sourceDir.listFiles(File::isDirectory);
        if (subDirs == null) {
            System.err.println("无法列出源文件夹中的子文件夹");
            return;
        }

        for (File subDir : subDirs) {
            File[] files = subDir.listFiles(File::isFile);
            if (files == null || files.length == 0) {
                System.out.println("子文件夹为空，跳过: " + subDir.getAbsolutePath());
                subDir.delete(); // 删除空文件夹
                continue;
            }

            // 假设每个子文件夹只有一个文件
            File sourceFile = files[0];
            File destFile = new File(destinationFilePath, sourceFile.getName());

            // 移动文件
            if (moveFile(sourceFile, destFile)) {
                // 移动成功后删除子文件夹
                if (subDir.delete()) {
                    System.out.println("成功移动文件并删除子文件夹: " + subDir.getAbsolutePath());
                } else {
                    System.err.println("删除子文件夹失败: " + subDir.getAbsolutePath());
                }
            } else {
                System.err.println("移动文件失败: " + sourceFile.getAbsolutePath());
            }
        }
    }

    /**
     * 移动单个文件到目标路径
     * @return 是否移动成功
     */
    public static boolean moveFile(File sourceFile, File destFile) {
        // 确保目标目录存在
        File destDir = destFile.getParentFile();
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        try (FileInputStream fis = new FileInputStream(sourceFile);
             FileOutputStream fos = new FileOutputStream(destFile);
             BufferedInputStream bis = new BufferedInputStream(fis);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {

            byte[] buffer = new byte[8192]; // 8KB 缓冲区
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
            bos.flush(); // 确保数据写入
            return true;

        } catch (IOException e) {
            System.err.println("文件移动失败: " + sourceFile.getAbsolutePath() + " -> " + e.getMessage());
            return false;
        }
    }
}
